/**
 *  Copyright 2016年12月12日 北京福富软件技术股份有限公司
 *  All Rights Reserved.
 *  文件名称: SystemWebSocketHandler  
 *  初始作者：g.huangshg
 *  初始版本：V1.0.0   
 *  完成日期： 2016年12月12日 
 */
package com.controller;

import com.alibaba.fastjson.JSON;
import com.init.SingletonCache;
import com.model.Message;
import com.util.LogUtil;
import net.sf.ehcache.Cache;
import org.springframework.web.socket.*;

import java.io.IOException;
import java.util.ArrayList;

/********************************************************
 * 类名：SystemWebSocketHandler
 * 功能：
 * 作者：g.huangshg 2016年12月12日
 * 修改记录：
 *      日期              修改人              修改说明
 ********************************************************/
public class MsgHandler implements WebSocketHandler {
    private static final Cache cache;
    private static final   ArrayList<WebSocketSession> users;

    static {
        cache= SingletonCache.getCache("sessionUser");
        users = new ArrayList<WebSocketSession>();
        SingletonCache.addToCache(0,users,cache);
    }

   // @Autowired
    //private WebSocketService webSocketService;

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        //LogUtil.info("Headers==>"+session.getHandshakeHeaders());
        String username = (String) session.getAttributes().get("sessionuser");
        //username   例:   userid-1     (userid-id)
        if(username!= null){
            if(null==SingletonCache.getCacheElement(username,cache)) {
                SingletonCache.addToCache(username, username, cache);//位  sessionid 建立一个名称
            }

            users.add(session);
        }




    }

    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
        if(message.getPayloadLength()>0) {
            // LogUtil.info("=========广播============");
            String sessionid=(String)session.getAttributes().get("sessionuser");
            String name= (String)SingletonCache.getCacheElement(sessionid,cache);
            sendMessageToUsers(new TextMessage
                    (JSON.toJSONString(
                            new Message(sessionid,name,null,"2","",message.getPayload()+"","")
                    )
                    )
            );
        }
    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        if(session.isOpen()){
            session.close();
        }
       // LogUtil.info("发生错误====>msgsocket连接关闭");
        users.remove(session);
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
      //  LogUtil.info("主动关闭====>msgsocket连接关闭");
        users.remove(session);
    }

    @Override
    public boolean supportsPartialMessages() {
        return false;
    }

    /**
     * 给所有在线用户发送消息
     *
     * @param message
     */
    public void sendMessageToUsers(TextMessage message) {
        for (WebSocketSession user : users) {
            try {
                if (user.isOpen()) {
                    user.sendMessage(message);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 给某个用户发送消息
     *
     * @param userName
     * @param message
     */
    public static void sendMessageToUser(String userName, TextMessage message) {
        for (WebSocketSession user : users) {
            if (userName.equals(user.getAttributes().get("sessionuser"))) {
                try {
                    if (user.isOpen()) {
                        user.sendMessage(message);
                    }
                } catch (IOException e) {
                    LogUtil.info("=======socket-session出错======");
                }
                break;
            }
        }
    }
}